Magento 2 使用 Model 建立資料表

Magento 2 使用 Model 建立資料表

Posted by Magento on 2019-10-19 13:42:00

說明

Magento 是一個開源的電子商城購物網站,在客製化的時候,難免不了需要自己新增資料表及各式各樣的欄位,在 Magento 內部有實作了很好用的 方法,有助於我們資料表 Schema 的建立及還原。

執行環境

  • Ubuntu Linux 16.04 LTS
  • PhpStorm 2017.3

1. Magento Setup 方法

Magento 實作了一系列的方法,在執行 bin/magento setup:upgrade 的時候會依照順序執行的四個 Class 。

  • InstallSchema
  • InstallData
  • UpgradeSchema
  • UpgradeData

所以如果要在 upgrade 的時候執行這些 Class 內程式的話,就必須依照 Magento 的方法實作我們先實作空的檔案當作範例,之後加入 Schema 的資料。

 

2. 建立 InstallSchema Class

範例如下,看到他繼承 Magento\Framework\Setup\InstallSchemaInterface 這個 Namespace 的 Class。

<?php
namespace Astralweb\ORM\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class InstallSchema implements InstallSchemaInterface
{
    /**
     * Function install
     * @param SchemaSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        $installer->endSetup();
    }
}

 

3. 建立 InstallData Class

<?php
namespace Astralweb\ORM\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    /**
     * Function install
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        //install data here
    }
}

 

4. 建立 UpgradeSchema Class

<?php
namespace Astralweb\ORM\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
     * {@inheritdoc}
     */
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();
        $connection = $setup->getConnection();
        $setup->endSetup();
    }
}

 

5. UpgradeData Class

<?php
namespace Astralweb\ORM\Setup;

use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;

class UpgradeData implements UpgradeDataInterface
{
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();


        $setup->endSetup();
    }
}

 

6. 建立 Schema

若以 Employee 資料表為例,資料表需求如下

欄位名稱 型別 大小 主鍵
entity_id integer  
name var_char 255
phone var_char 255
department var_char 255
created_at datetime  
updated_at datetime  

若將上開欄位轉換為 Magento 的 Schema 格式的程式碼如下:

<?php
namespace Astralweb\ORM\Setup;

use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

class InstallSchema implements InstallSchemaInterface
{
    /**
     * Function install
     * @param SchemaSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     * @throws \Zend_Db_Exception
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();

        $table = $installer->getConnection()->newTable(
            $installer->getTable('employee_entity')
        )->addColumn(
            'entity_id',
            Table::TYPE_INTEGER,
            null,
            ['identity' => true, 'nullable' => false, 'primary' => true, 'unsigned' => true,],
            'Entity ID'
        )->addColumn(
            'name',
            Table::TYPE_TEXT,
            255,
            ['nullable' => false,],
            'name'
        )->addColumn(
            'phone',
            Table::TYPE_TEXT,
            255,
            ['nullable' => false,],
            'phone'
        )->addColumn(
            'department',
            Table::TYPE_TEXT,
            255,
            ['nullable' => false,],
            'department'
        )->addColumn(
            'created_at',
            Table::TYPE_TIMESTAMP,
            null,
            ['nullable' => false, 'default' => Table::TIMESTAMP_INIT,],
            'Creation Time'
        )->addColumn(
            'update_time',
            Table::TYPE_TIMESTAMP,
            null,
            ['nullable' => false, 'default' => Table::TIMESTAMP_INIT_UPDATE,],
            'update time'
        );
        $installer->getConnection()->createTable($table);
    }
}

 

7. 執行 upgrade 指令

設定完 Schema 之後,請在 command line 裡面輸入以下指令:

$ bin/magnet setup:upgrade

執行完後,就可以看到資料表出現在 Magento 的 資料庫內了

參考資料: